///////////////////////////////////////////////////////////////
//  Copyright Christopher Kormanyos 2002 - 2011.
//  Copyright 2011 John Maddock. Distributed under the Boost
//  Software License, Version 1.0. (See accompanying file
//  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt
//
// This work is based on an earlier work:
// "Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations",
// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469

#ifdef _MSC_VER
#define _SCL_SECURE_NO_WARNINGS
#endif

#include <boost/detail/lightweight_test.hpp>
#include <boost/array.hpp>
#include "test.hpp"

#if !defined(TEST_MPF_50) && !defined(TEST_MPF) && !defined(TEST_BACKEND) && !defined(TEST_CPP_DEC_FLOAT) && \
    !defined(TEST_MPFR) && !defined(TEST_MPFR_50) && !defined(TEST_MPFI_50) && !defined(TEST_FLOAT128) &&    \
    !defined(TEST_CPP_BIN_FLOAT)
#define TEST_MPF_50
#define TEST_MPFR_50
#define TEST_MPFI_50
#define TEST_BACKEND
#define TEST_CPP_DEC_FLOAT
#define TEST_FLOAT128
#define TEST_CPP_BIN_FLOAT

#ifdef _MSC_VER
#pragma message("CAUTION!!: No backend type specified so testing everything.... this will take some time!!")
#endif
#ifdef __GNUC__
#pragma warning "CAUTION!!: No backend type specified so testing everything.... this will take some time!!"
#endif

#endif

#if defined(TEST_MPF_50)
#include <nil/crypto3/multiprecision/gmp.hpp>
#endif
#if defined(TEST_MPFR_50)
#include <nil/crypto3/multiprecision/mpfr.hpp>
#endif
#if defined(TEST_MPFI_50)
#include <nil/crypto3/multiprecision/mpfi.hpp>
#endif
#ifdef TEST_BACKEND
#include <nil/crypto3/multiprecision/concepts/mp_number_archetypes.hpp>
#endif
#ifdef TEST_CPP_DEC_FLOAT
#include <nil/crypto3/multiprecision/cpp_dec_float.hpp>
#endif
#ifdef TEST_FLOAT128
#include <nil/crypto3/multiprecision/float128.hpp>
#endif
#ifdef TEST_CPP_BIN_FLOAT
#include <nil/crypto3/multiprecision/cpp_bin_float.hpp>
#endif

template<class T>
void test() {
    std::cout << "Testing type: " << typeid(T).name() << std::endl;
    static const boost::array<const char*, 51u> data = {{
        "0."
        "33937643772780730649735035088117439284797964277099188367427256402032493952288848579083622213428182842627923924"
        "48756039374320401316623090661027453350445130229848059620725772447135993602719895441731738122842098615256225319"
        "68966190014182927691030345617943934007886356104243607756223704911491705014754530347473066003045076503619149041"
        "38327962144190354572359428689767990353722392457982930942617983634601752",
        "5."
        "97468334468718718746852358109643964574917665370102517920633723981720748281510749894686736725354210459236593137"
        "15467371148678693662985453590831122722616951299822923837410906027605763677066945998696776562438704017846907508"
        "67718676242189937636463637174311651907173341377565099188022209604561582753074167930566604164133185975701201538"
        "9431793705875600863391408448065773828563483223117178640044499399723744",
        "383."
        "32826140718915582837967448860824902040431804683461630967288341613741467095168380744762629948507973653220772087"
        "88798929212818319649361162376647028335854234182413425051156224048725243707995842958634432911120804119705416230"
        "91642041442378552123914749380769357223860122466778135685197693936177556073728173723987641014012941493539784260"
        "57544810680225593132066193858006901125069663362991172745649465725272",
        "180470."
        "88334757918167934673473709881208559849920820465419382707969109187448281704429118605409224039018180517847684905"
        "66096242950582808839866049915821374672216813937278126384998986538404253184629081327431877375329502500647373666"
        "03336400523861219461839350536299284967145607490824852752423740671681494352721693344750605249743843073517572016"
        "98786200303374802146857634893509516262245925287553380389076772488",
        "6."
        "27814979541895132079779989753386392593023784136580354596036224328391177908454307627536146182992221314339879865"
        "11235061633658516824123179660244932375967566163895461895213509376427850290780942550513918615228886566287592461"
        "08576255420826916900067214959237545114945766499172694718514546926393297507568156066242841704193284835744722017"
        "5607720561540370653825438750168143857523868718856189519864027430308779e8",
        "1."
        "61378311475085211322322670714632479856369478306922436649215224573942949881296666667458540847673258827172543183"
        "22908201512400243137564101564235450151960593110176457803621675408660678871179456625850704076654060872094257085"
        "91913475592591085952002637996909949292172808363998902967580859827817021591187975132057405313269917202808210233"
        "6989338403081942130794464992491330850160862146024982135931859868176809e13",
        "3."
        "06512100486509488695311966713424774135953861543553382268460279760802940061044900933507888352533662551959903493"
        "47446345282573511244205642671979187494803891355258978864343448843705774753635563414146154705564330331067052805"
        "31443046669163916446454890662947185057748542735928453570069226294801221403438864013368364219717148075652123561"
        "545773399076318560221173734215703610924057158101731263882232550297741e18",
        "4."
        "30168936021062158647714344640257355471929568870493746806499267079198142419617798122002807499302565019978495076"
        "95395125441756421661413154730888574483309057229943886742437071251707738990393977398403536175642762242808350076"
        "54301800968272501912510617592944886642852698437001746511723648465317959686964311779049286600206430659310416941"
        "0537341890174831622159415936125041593936992634719906123727028419057537e24",
        "4."
        "46086859296813600010249357918906616555060494871223312224917892659295036515404050360319903809184591045832557356"
        "20288691363060079360758406339887417913286769718423759522832754263499878135869223253358698774066131403822428286"
        "31835139057483887730793431725188089082752332536065827506009911990210239971499270414674374410896836275562432510"
        "7486994088414126705458507082103811086372240878942983212662081104875997e31",
        "3."
        "41813159558168064725693574411003900295360033129819319540917443049744915277435998222300067606312043022438556672"
        "16955365986192324833652299336285826148922073950348547795494738267861098328516497599288314822606511466743212319"
        "77018014196914755402332688365134862118727682384983928360907133692331665531682885594368910062161908382212778828"
        "4160652232283630351386798636794979234576432977468152969056493038423561e39",
        "1."
        "93529462827279081014145302127852497636407769190524801588816591906251667334497709126264426283293464161322992688"
        "86589920690636914906717492301836773331460154604580407945460359957380672599434023197425489039882987443681919056"
        "32226843722418491007498558382918483103429386550410133802781855587194608068771003506223878994914331955010880109"
        "4190098446234092310048150477274502060870736716324117412815209633124145e48",
        "8."
        "09644495118900985658414964360164316516923077647027842349017414081353813746684390209864706759411109236144469056"
        "96410406066640351065195237123718468440597743167713019447544827353458477844468727834630038609140168354634397475"
        "74184005307991021090825125222366580681313172426233469313765621801028798160109725953406890347181218921245923185"
        "1835393208367369054618963204727992168556204168791513644815218096463093e57",
        "2."
        "50282570926251745491750089522225691418163836379049816443794738582507368961742165396737335216276072093220194134"
        "20937570273676341726636306931304501320694017061891400181233108050930610234076339285157392030024769366663118692"
        "57146949325624395201870569392491903762108304169622737558926481187676143003554627031201457043186026864427640645"
        "7398485042029556392894799022733858611415899182421526634018060028309384e68",
        "5."
        "71683702137926499674663153128641796628951701926950507890613628395108364181246459680329891490683110189943245174"
        "20345278843446068634292140996241291031113395887824145000873531937856827299256489358571593850210528248202703396"
        "45536336444699615892967498995948368139326378248643023128806723109514091974192833746649266585790291311466476745"
        "0432510739209971738097074002526312039248809036478310948111740897528204e79",
        "9."
        "64872611696700312079558418997293865027081250983947778086151839273421639092840259922432010204359151226988086497"
        "11566042372911206942311277943247994427354130507790526857797833309691667375441761513692598664419973302444660838"
        "88217371871338715801380211250216925486096110574589512441535200228948548390895267456239655279044165675571170964"
        "5516914188860464353624992313010889765422981069429049436524222321550149e91",
        "1."
        "20329776602386082325370051588516683110899862359654632492203777786384899723559748482090350823338223099022371650"
        "42868213438627625544096344578102199846440476859557339736747791529782018329078191477783605471526120462726353510"
        "14737379834729265012293028940481674819319490738257277490632376634275809297998963344882863644507401611033133869"
        "9464788279882402189027828261039788079556739180915346692779065476431369e105",
        "1."
        "10883060812782887544924011308975902624045718132814606056838361396692812184425014219355331706369908661651816645"
        "61596333701204545493730707210930818738817252706131805203538144119244917164949716209095542194899833868499263375"
        "70031393425715560082460141804245213821154924883796734487409524828388792914592310315333281009169339388880965308"
        "1365270947112297406471162377655179657693898463736926911943490619163092e119",
        "7."
        "54998805916259656638680428326753009017992457324185017076467921355120532848351382947969760486916683154424278349"
        "49618514094329533376442442492757936744857569785450769927581802961191319878260712808001736830227501518832554201"
        "81622420730061431071243047053802294895743300482310274603765409684526699851862333211889291650502062786840561894"
        "2429551700207476696585635930562973459491424179233918050890206232214765e133",
        "3."
        "79853635800679762402503301653007069582698268515493717324602209234598228090079184957804121097003783527039828995"
        "61570150646963751463572075768540297484136809462018052149545042828665345287117150392150513078663739946623681053"
        "68505465037259587291440042344663580680646178313958620437868058550744621854406871361710599007951099013146571208"
        "384054250556080476992977623024059268095813712424244902009427293468485e149",
        "1."
        "41213193415725812702153598487066305427766336757115296875934873462592839607080956014948231124866310237211242356"
        "40943167173029348028743563902367757599140008654691320430919753414890689949599421028277624880392344132646738394"
        "54619563826127968754320850393217292627529421842908681656021339918017949400410916454684489963238517783544294617"
        "4653663068675983237955855108059376913611877439522917217336109804190399e166",
        "3."
        "87903077199979745106643397442602333738810961999331522026625565567797837751065639869118595264132820552586125224"
        "99767709123313205863879946518297779104337686883587019222829967005608205535314284003183828513113021722123872387"
        "03643511351735667644737671559540817955526787194767167909898665166571927934802505871381779687679591584415171910"
        "3197410787508530261619841035613531487094949084263218956635085585632719e183",
        "7."
        "87336053738358403974345232640385984056728299256511658470656683243854307460876333488489056378354287394014396798"
        "96923081980364912472282573695612463537585283007941057172128277340402716645674443632827653710173742423648839359"
        "54777769477857667560464588021983337522794199842632588655843521435502224085456355886408062775865343942991707275"
        "3785194675103766900514602432580639079224631229479607396935864512990879e201",
        "1."
        "18082629950389009425178914579262000630180796953484697627255203778763700057715189542510153384028860976897628950"
        "44056273430051256244413916763438966705458118354189107806216991150264176024521937328179762640422127608560103802"
        "43167214486601321640515719770978848419772005770211878816878981607456020807826043354828388153590907111655389789"
        "3659656781376448427981358955547508806938614921874867135186509274509121e221",
        "1."
        "30858174999878426551305488271689556558384321402452281696918922677077787904987739148331993689161140439661973295"
        "62444577848635313938483757629541576533880917215885485474416704968999200090496252044959849927443732134176975867"
        "86998601131597562586800906537304622471606316897778810386688572047109554738534286863201895191060393683578938746"
        "4412366605713487321530237148912677199033012777178113821791621549557963e241",
        "1."
        "07153081480068991619038813538296440692171211386826580344130515756045616495762614285688880942186204446350132207"
        "05511245290719605273316790249367622122178650529000528086055415007045458486410501636380119413632657994999412652"
        "18843006312847033681740148217258036637407933129512920093624644634783238060635329385822275868747961292718153023"
        "6387227215663399410099251455256898414199913458340065553949424990477448e262",
        "6."
        "48331965100630950223764050595501238429357093260235378484937789053462018029627222607642449009757709351188650397"
        "35904093764776116679888935421171735987167888371792653849212017720136116318927292508358228044947423163304066884"
        "75091973437669111728949960922002370308207819760146543720499389938855072810566961589413895110830251224194598788"
        "696990065693705615156654866578134664648091752361824241438921952031149e283",
        "2."
        "89853913045427682931727097752307679814777215288854083053556195306901194262072695630497568249393971572218777755"
        "31212262059946098575425050827283362457005503261796116156917077778477251551070762614233325253060283603452216492"
        "68153183915464923208092878706633839991585032738161467245610237424895021024826679607245762337007919557432284659"
        "4267768883120374288952014885152055438195794090975578878933873824774214e306",
        "9."
        "57524433627083921372674145950563946532138741951042299439035158875449060589509856903496678820625880407684156184"
        "67576300179061328983586984432582196507026188089413820743600336619502440390216246792909515578785240971073577534"
        "74909093111963153327116805520444674581696153661168724694358406085344894253222472789266720597479112669810243669"
        "89976214521515026692183039600169984107883592297128416659318858313127e329",
        "2."
        "33727345033623693753810095241973508303164720347217597617975362377386704710094235435422515724882290456995981608"
        "34162677357730620072441755506075897500940629883044875771104686291523502165266242030847074909362622098365719455"
        "33235993874613862916130471738526530998089807948995995515764456623244080513770107131149565333060607161133194124"
        "6434767948905863368638163788562679785940566685500460815077065003612487e354",
        "4."
        "21558791269371992409699094485991868684847178872987296051500332991235349928573329181681352308437386959256983838"
        "15575417820480732378749635394939513838137876524333991937836847074991505476867647762082587225838063325020413513"
        "07712832158143942900148597775176579801110109207261305368742298335214046856917156477394123225605706416114234166"
        "1775359191159220450305300322654184921617310753474842253496677498824723e379",
        "5."
        "61818116133757012489702243782567404946920662424376026524697405127382975992354145939996168919451561868277363261"
        "84687322137498447792007445397397290336810468925670064733464757082986791232916898141597610692740388799796632396"
        "70814902724343685975252680511277879064509655577022780987369558996980567860110615755638697422164766959082771235"
        "3133603091803570183764883405340587430017053183637835511899658145649708e405",
        "5."
        "53251106928220535092383018707346612727458446719546860788676375087729439299366382143215888575356349523813139437"
        "38654286540526043262643301046462576597601613866207167167036316086433126132458046255118139642751094515137365585"
        "14977338129201153666764317441936156609643185133981728847167450887861106642311329612564652645663234240748195490"
        "808151911497393974690166034839217817023634217121406163178148652748479e432",
        "4."
        "02566663067613312406532171367315316230170176957139429170278517627053463573307885864114313789720099805323107576"
        "89380174461664677676028378924382554201434975574729861177781849023768222381429947872325368088023224591306630434"
        "88752921545958076086307590768624852116859030963646844864851375289385176731569346963898087464845711433555720211"
        "5472595647478331668869318302753802858726588719006447471192697846325955e460",
        "2."
        "16442373466816634246017817691597979198342453652307355890587969859747455944859888559714139368208719357146022376"
        "43458356241187573307428309041919648027960168541647193436225977495680484218384107820095589356463058222584008532"
        "49706917999367853343113123362931285077152897044363460429014314907920951386813058571300608073348849116032114573"
        "5562062411305931183571279530201672366980412430529846635995189699318073e489",
        "8."
        "59875809811959836620472472169360664857317603153715063860770566914095798560147630326195395399352997161104116887"
        "93466397984311640631361934500807639285587334983206556915704635831992012926186843826981296831658998834850783404"
        "71305082909375312618955662509599462160530004719996233209885723635980168115741960667641219878309281636433604730"
        "6243999363335004760439115355072350465422891365411868472688286678516314e518",
        "2."
        "52416731631871272761346107169547241622702902287736417344208646182452119260176248298406858601305792577721263986"
        "22324109858115624706486522844752512951837805396709793171502497523431473021570806024043139443284538862368635312"
        "79953910826408402803273129548728218861682026168963492642713506088794279763514769384995005867275345857647649173"
        "3064455826768562371858057444914175251596852571637211466017938478085247e549",
        "5."
        "47506791182338766132594205708195704492779627444127804280501483514467832109262303414703151880706323497607310257"
        "42570791702834581720467527197241529413168425211960698044258765079274184234095237392617266811206620971599430494"
        "01039490818332686968135012747332468921142470970507219403290422458185430415836291605355383658657658638112408092"
        "789126678938878667507151950931633694006471359998448912249374833586727e580",
        "8."
        "77505496899502567766394687245741586296033200143902756810286745508263570801364223994762134327913766562227638006"
        "28593282303459051561266270006921840049305819767639184391149913915312831894296821356222752594264134130151457242"
        "71353924842188383735344218172453070693322015850724076032518206800155329494926859617841863416432387497193799707"
        "2367419479635154591248667559627811893588163238012665671798461211917208e612",
        "1."
        "03920001583377732737511565764160246646536796899738563734563048433393029779232542383764970440277281580589033023"
        "90909588333829463843362779584402914847447592731182614369968957680281500946805571235013941407979569788567794900"
        "81025715443359295816754518668713781010184800010733507448605095938797451641465463887974096617578601649279784516"
        "9374594168995878543584318334800124941205910589727264397237600733483158e646",
        "9."
        "09363267536367272405745466788391706650191691109438788949330932115559769957014680414493273700736818986906384661"
        "36204694745206283652338526673125958055131610409923286526192661778126811265116493171283319361595267283588121098"
        "34970395192966928196667559689026648386421759155570755276556575684270105614429007586789352037941952177591304796"
        "4393758374891516340929062076304350159966063972713118995033247759001609e679",
        "5."
        "87982816369304899641620094290092578679067925080588016270421219535999129512653159337234401858255190801029880568"
        "36911095299854840387008575164090793635997912930561430335216151607097220208013034399895832350235280120270626904"
        "35619693516670177376868031106326438089133102151451875783922081850690599784722878343901525276805516616594158203"
        "0353226255576433910936297965207260585437762430381969160714956727596198e714",
        "2."
        "80918812929111084043459758968155589584778352607377945794172845124134733889680575870885550412662974868419236287"
        "02282019643659456724373332519583025947015025975126598748630623031951723754960589046233996595466021913942587558"
        "32666059306319790528857335355910688464528553149762694037980050047428244692923791456853466586870374273171363234"
        "9090897884403966643055728471509474896855575286123275564417626861566706e750",
        "9."
        "91712937259767113206767386673924623817974241723106406296023286672533757528193859721207369716800015502715814816"
        "58616174000808376999687855051075798318036855160548374473251503888674887541706772280965242243924102322062382639"
        "33144338637103531441623303187445874039234973380151391274490746625993568552049954630793219419614845431626975962"
        "881182662815760423226111647056071831411664335144052772436215105801395e786",
        "2."
        "58690271635431111218786799870816477151878728266773984750967386405836598000689673795513763221703475374549181906"
        "03891312949716382621902484616361664158953484778255247083652726854621059785392022847887382779010079407502679229"
        "02108532067590310957376933127741337227236321889639796566258135788673969137620431690897408182198043217806539422"
        "8926767529685562155837452626029223937027004015040825450642409597700449e824",
        "4."
        "98612519312070809237856867988817891938138796108426752053612101558947746863287108939065436824470292069289349675"
        "25495260314937837003448878215156341411477636831113484416124080974502217578408248150338565305116223944900839866"
        "52862296035272393854871331942579845334540299214607886805326360623407444302415524345062363472091243884102296990"
        "9473424559262711669905282193529250216454066716533180418518228387188393e862",
        "7."
        "10125690143390682411017512339532342165228402803424065209092882320127995478719607237198365163595481988427495369"
        "61644100550279020276709043358260853581760590386456213180291689322352732545965831405519844109680619067101311180"
        "95939933992270659609852696914898117351986513950866563131731042417837883337060592244909474551081261856381353734"
        "7841030916512147874232760564378443782164868016244561788356251308121716e901",
        "7."
        "47302153604866421354317547470748853778401956835830182548925022450119737120842211168133644234928020807997681745"
        "34590613188275471080608467087354983850284805514875889145266688973752185071777341375422809910165581997555433091"
        "93995940656983118345987234477870709809494119348906153216024977585642656969612719345333954837167922967627266308"
        "4782830276508737129506676031759345288056484158647796152349867328841634e941",
        "5."
        "81093753642091122275796546587309770308694543886070769036394659922966168320029641380009476688371405433259082226"
        "88655359602408511410663722770167244801973012245657865182739637159804595049180263175014778215232564251739259624"
        "75958995367766135610455483155107326366818828386112352168844513216414776232111159702852313009386415399997437679"
        "0494383016372210442340324038686843345053322425194077414241243050491297e982",
        "3."
        "33875955701899627718146291382268063073604182131575843695486667154496711979350813988644889979275310892951143249"
        "90139844785908367473984008445446585047577469632514214867193740710854025084590094114280015734566576140393088979"
        "74248089795695503252715585184045590075516256377611426621077579137632219122829576817840535643871040623177297887"
        "37215450574233690655931888608424916152893688106181220341997128198692e1024",
        "1."
        "41746728778233347096101173197688307390807344073539051456326120888249557201987349966042612500192919558836203335"
        "45750761619015467840567122066622229379056280064206319780047687015558007624774062399477328822231085767309831266"
        "03261605306585873937381865168712809333564038851339619111853718128033443029243918873752436226978927230890572381"
        "2818882228503013875816702686587035844437102478263525616196832018321602e1067",
        "4."
        "44661890167910915168017238808125335284385970805494109112356556113820105031457892861587455557714835779436627687"
        "73465284793798720178177605712848440200402906836390133865748188969184005230383247111166918721449908133920663776"
        "95278668383703818043626473893735410115386717180431576947105030318212926944229235438803729812517794121792684580"
        "3005587166270803697433886463469168814941555804311717400657004050157245e1110",
    }};

    T eg = static_cast<T>(
        "5."
        "77215664901532860606512090082402431042159335939923598805767234884867726777664670936947063291746749514631447249"
        "80708248096050401448654283622417399764492353625350033374293733773767394279259525824709491600873520394816567085"
        "3233151776611528621199501507984793745085705740029921354786146694029604325421519e-1");

    unsigned max_err = 0;
    for (unsigned k = 0; k < data.size(); k++) {
        const T x = eg + k;
        T val = nil::crypto3::multiprecision::sinh(x * x);
        T e = relative_error(val, T(data[k]));
        unsigned err = e.template convert_to<unsigned>();
        if (err > max_err)
            max_err = err;
        val = nil::crypto3::multiprecision::sinh(-x * x);
        e = relative_error(val, T(-T(data[k])));
        err = e.template convert_to<unsigned>();
        if (err > max_err)
            max_err = err;
    }

    boost::array<const char*, 50> small_values = {{
        "8."
        "22316731935829980703661634446913848582144002782963369691737543334891793865465935159602008003640667134371803986"
        "3220496616e-01",
        "2."
        "52612316808168307914125150542057905519754287427660807488094965301981076906859379060653702096119874148769247363"
        "3089323967e-01",
        "8."
        "34298174459528203725621864796971247632248789055078482376324989355615327097517295140409495058794495956184975049"
        "0537201329e-02",
        "2."
        "77813501606829978993867168084548065398497650701954265378863716111658730616829088676125907284682924912158969820"
        "6609261524e-02",
        "9."
        "25939156519991644278940030699679448954086271119376181826241521108438946875431552552589623882735888982687500604"
        "2447587516e-03",
        "3."
        "08642465328777235821960752993209788443504304052715544018764009557271067645265480373000357774763369031800196150"
        "9535020849e-03",
        "1."
        "02880676585100206481006108401482647883274507746970814963573040786621743675133752041745809026579108615643827523"
        "1514030381e-03",
        "3."
        "42935534842522698844119839011910921771650376983875336511255044273840632663768463905225289831464689249004539529"
        "0022292013e-04",
        "1."
        "14311842955860337440665354154429269054893736161833612528701836133207242647463210521729715081023413862676725328"
        "1422813482e-04",
        "3."
        "81039475781887340626687729664168469331219473534189836887306708992817261906742375125704969198563848076203267397"
        "7695116880e-05",
        "1."
        "27013158566642183281752783413747759326638752570138860197573323743636950573371579931042934974416879237508283450"
        "9467436523e-05",
        "4."
        "23377195212021994794045963463657653910157772434742830507237810056264954888442021822469246174873972509062675442"
        "0296122389e-06",
        "1."
        "41125731736965901370420900028843613271044916296312734056296127133724258266101358087416590377024616917919226883"
        "6124421074e-06",
        "4."
        "70419105789747536582540991678689839236423566790675276751458046715216361965750891079774226640696151635843925243"
        "4955007668e-07",
        "1."
        "56806368596577371404592849271936001489436853198775941483377846637481983654515737595069375666455025613622239687"
        "1173634254e-07",
        "5."
        "22687895321922667352499319339250305847586201772684854871710065839247063365038727400451194051505640506913703393"
        "4323251644e-08",
        "1."
        "74229298440640818599124087499568948774514022803120251092371178472944049408806698943012810175926104731673607466"
        "3327672115e-08",
        "5."
        "80764328135469369212496704400968728311459735571706215649361824587691013160733818394483090838190372856032828417"
        "3507220743e-09",
        "1."
        "93588109378489788770168645148560167113134293078506149370396941872852459457392228230966527555870904051946156060"
        "0768780392e-09",
        "6."
        "45293697928299295542291685192078554310638371538192462617599585992435155232588093118761490398480179328707157864"
        "0505194508e-10",
        "2."
        "15097899309433098500827951904651295782552121823879079220183549721553485198975072210523482630073862383844630925"
        "0309905466e-10",
        "7."
        "16992997698110328331178626166353125823054797269050049347688107929512957913128073402478410721904537934546088666"
        "3104148486e-11",
        "2."
        "38997665899370109443544188468445442183532794889313618457393886481900294444233945682793147223727435390363403675"
        "8669394620e-11",
        "7."
        "96658886331233698145079879986050634528756689881074434268014692502915117898103389075991616818991617750459293924"
        "0995619757e-12",
        "2."
        "65552962110411232715024129813544007580584848805480057770376866810065803699958422845110023903904292068137738139"
        "4421710121e-12",
        "8."
        "85176540368037442383412841286453036159109725223062196542627553253324258168024579474106790628529865511680294499"
        "2368126680e-13",
        "2."
        "95058846789345814127804246178495691468733867514049770733387135881918539535656920666145099714574875695649795970"
        "2280685427e-13",
        "9."
        "83529489297819380426014141243014531839864975333140111262187179401292836698823374435423838709064958938210470422"
        "1708773516e-14",
        "3."
        "27843163099273126808671379944512086919859389936465503631400756690637866633966529728809259679613568481688350378"
        "1385164489e-14",
        "1."
        "09281054366424375602890459964103062663653292873590432078433762584410809121350661905104220614838597535470023458"
        "6478575025e-14",
        "3."
        "64270181221414585342968199873898739875276468675462649225232456745693862357923939267814279702021349384481645412"
        "9960310753e-15",
        "1."
        "21423393740471528447656066624394216908910631253431792049046297535130535447102053276401560631587208593326268729"
        "9655265697e-15",
        "4."
        "04744645801571761492186888747892316961980551719443347190883572659511690518767213280136994837755128260482873361"
        "6045843751e-16",
        "1."
        "34914881933857253830728962915960831355189015296901018459704249675852829734635155364324120876919155789892554336"
        "9605617734e-16",
        "4."
        "49716273112857512769096543053201558480702457677479902049412829345128192763726719248955805009083545430244878039"
        "1749096414e-17",
        "1."
        "49905424370952504256365514351067141245298562683399837986238794859241822922880828408893449102085203792475675848"
        "3008288052e-17",
        "4."
        "99684747903175014187885047836890454182500546027717930560216174868165426224357843520109698609337713157732557391"
        "7436618470e-18",
        "1."
        "66561582634391671395961682612296817444716429061698018974618485153735124830966533060150334321537698155082256916"
        "2631313560e-18",
        "5."
        "55205275447972237986538942040989391254196583434965757861523256758504730985639095762570289617805227580640695707"
        "6143469634e-19",
        "1."
        "85068425149324079328846314013663130409613990276938179581475467298985070140164137481425407156487211993349861923"
        "4778448524e-19",
        "6."
        "16894750497746931096154380045543768028916435169528349331202563235931774471564319241480714539461357239759053436"
        "4339391526e-20",
        "2."
        "05631583499248977032051460015181256009522878423660107211374348445532130033892643030142188092736759017844092200"
        "6775473367e-20",
        "6."
        "85438611664163256773504866717270853365033323153120353951855295077781744017927782348761920151325800088405263751"
        "6041835420e-21",
        "2."
        "28479537221387752257834955572423617788342850745148266005455745282446061977764284479644909164641860179104730881"
        "4504431261e-21",
        "7."
        "61598457404625840859449851908078725961142246814978719285409513999456804359876636055759814627948267818028133539"
        "0895949036e-22",
        "2."
        "53866152468208613619816617302692908653714060456763937265527505767398068037267360949096307006281952029599832832"
        "7889923353e-22",
        "8."
        "46220508227362045399388724342309695512380193442955481318569834447220399599770887952732255571569786057841657604"
        "5982358004e-23",
        "2."
        "82073502742454015133129574780769898504126730848407716875331110811637423550869790482604995978111601212707595178"
        "8533527897e-23",
        "9."
        "40245009141513383777098582602566328347089102717194570980415245666901519373620102040175015319659035952534120746"
        "6344738924e-24",
        "3."
        "13415003047171127925699527534188776115696367568293332847643781010995942539505001930607413578045916809227032757"
        "2635795510e-24",
    }};

    max_err = 0;
    T v = 0.75;
    for (unsigned k = 0; k < small_values.size(); ++k) {
        T val = nil::crypto3::multiprecision::sinh(v);
        T e = relative_error(val, T(small_values[k]));
        unsigned err = e.template convert_to<unsigned>();
        if (err > max_err) {
            max_err = err;
        }
        val = nil::crypto3::multiprecision::sinh(-v);
        e = relative_error(val, T(-T(small_values[k])));
        err = e.template convert_to<unsigned>();
        if (err > max_err) {
            max_err = err;
        }
        v /= 3;
    }

    std::cout << "Max error was: " << max_err << std::endl;
    BOOST_TEST(max_err < 2000);
}

int main() {
#ifdef TEST_BACKEND
    test<
        nil::crypto3::multiprecision::number<nil::crypto3::multiprecision::concepts::number_backend_float_architype>>();
#endif
#ifdef TEST_MPF_50
    test<nil::crypto3::multiprecision::mpf_float_50>();
    test<nil::crypto3::multiprecision::mpf_float_100>();
#endif
#ifdef TEST_MPFR_50
    test<nil::crypto3::multiprecision::mpfr_float_50>();
    test<nil::crypto3::multiprecision::mpfr_float_100>();
#endif
#ifdef TEST_MPFI_50
    test<nil::crypto3::multiprecision::mpfi_float_50>();
    test<nil::crypto3::multiprecision::mpfi_float_100>();
#endif
#ifdef TEST_CPP_DEC_FLOAT
    test<nil::crypto3::multiprecision::cpp_dec_float_50>();
    test<nil::crypto3::multiprecision::cpp_dec_float_100>();
#ifndef SLOW_COMPLER
    // Some "peculiar" digit counts which stress our code:
    test<nil::crypto3::multiprecision::number<nil::crypto3::multiprecision::cpp_dec_float<65>>>();
    test<nil::crypto3::multiprecision::number<nil::crypto3::multiprecision::cpp_dec_float<64>>>();
    test<nil::crypto3::multiprecision::number<nil::crypto3::multiprecision::cpp_dec_float<63>>>();
    test<nil::crypto3::multiprecision::number<nil::crypto3::multiprecision::cpp_dec_float<62>>>();
    test<nil::crypto3::multiprecision::number<nil::crypto3::multiprecision::cpp_dec_float<61, long long>>>();
    test<nil::crypto3::multiprecision::number<nil::crypto3::multiprecision::cpp_dec_float<60, long long>>>();
    test<nil::crypto3::multiprecision::number<
        nil::crypto3::multiprecision::cpp_dec_float<59, long long, std::allocator<char>>>>();
    test<nil::crypto3::multiprecision::number<
        nil::crypto3::multiprecision::cpp_dec_float<58, long long, std::allocator<char>>>>();
    // Check low multiprecision digit counts.
    test<nil::crypto3::multiprecision::number<nil::crypto3::multiprecision::cpp_dec_float<9>>>();
    test<nil::crypto3::multiprecision::number<nil::crypto3::multiprecision::cpp_dec_float<18>>>();
#endif
#endif
#ifdef TEST_FLOAT128
    test<nil::crypto3::multiprecision::float128>();
#endif
#ifdef TEST_CPP_BIN_FLOAT
    test<nil::crypto3::multiprecision::cpp_bin_float_50>();
    test<nil::crypto3::multiprecision::number<nil::crypto3::multiprecision::cpp_bin_float<
        35, nil::crypto3::multiprecision::digit_base_10, std::allocator<char>, boost::long_long_type>>>();
#endif
    return boost::report_errors();
}
